package com.cms.recursoshumanos.component;

import com.cms.recursoshumanos.cache.ListaArticuloCache;
import com.cms.recursoshumanos.component.base.LabelListMenuItem;
import com.cms.recursoshumanos.component.base.ListStyleButtonField;
import com.cms.recursoshumanos.constant.Constant;
import com.cms.recursoshumanos.handler.ImagenesHandler;
import com.cms.recursoshumanos.object.Articulo;
import com.cms.recursoshumanos.utilities.Tool;

import net.rim.device.api.system.Bitmap;
import net.rim.device.api.system.Characters;
import net.rim.device.api.system.Display;
import net.rim.device.api.system.EncodedImage;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.DrawStyle;
import net.rim.device.api.ui.Field;
import net.rim.device.api.ui.Font;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.TouchEvent;
import net.rim.device.api.ui.Touchscreen;
import net.rim.device.api.ui.Ui;
  
public class ArticuloListButtonField extends ListStyleButtonField 
{
  private static final int WIDTH2 = Display.getWidth();
  private int WIDTH_TIME = 126;
  public static int DRAWPOSITION_TOP = 0;
  public static int DRAWPOSITION_BOTTOM = 1;
  public static int DRAWPOSITION_MIDDLE = 2;
  public static int DRAWPOSITION_SINGLE = 3;
  
  protected static final int CORNER_RADIUS = 18;
  
  
  private static final int HPADDING = (WIDTH2 <= 320) ? 6 : 8;
  private static final int VPADDING = 2;
  
  private Articulo elArticulo;
  
  private boolean flag_busqueda;
  
  private ImagenesHandler handler;
  
  private static final int COLOR_BACKGROUND = 0xFFFFFF;
  protected static final int COLOR_BORDER = 0xBBBBBB;
  protected static int COLOR_BACKGROUND_FOCUS = 0x186DEF;
  
  private LabelListMenuItem _labelField,elDescriptionField;
  private Bitmap _leftIcon;
  private Bitmap _actionIcon;
  
  private int _targetHeight;
  private int _rightOffset;
  private int _leftOffset;
  private int _labelHeight;
  private int _descriptionHeight;
  
  protected int _drawPosition = -1;

  public ArticuloListButtonField( Articulo elArticulo, long style )
  {
      super( USE_ALL_WIDTH | Field.FOCUSABLE );
      flag_busqueda = true;
      this.elArticulo = elArticulo;      
      _labelField = new LabelListMenuItem( this.elArticulo.getNombreArticulo(), style );
      if(elArticulo.getFotoArticulo() != null)
		{
			set_leftIcon(elArticulo.getFotoArticulo());
		}
		else
		{
			set_leftIcon(Tool.getInstance().getFotoBlanco());
		}
      //int p = this.getIndex();
      Font defaultFont = getFont();
	  Font font2 = defaultFont.derive(Font.ITALIC, 5, Ui.UNITS_pt);
      Font font = defaultFont.derive(Font.PLAIN, 8, Ui.UNITS_pt);
	  _labelField.setFont(font);
	  
      elDescriptionField = new LabelListMenuItem( elArticulo.getTipoArticulo().getNombreTipoArticulo(), style );

	  elLabelField.setFont(font);
      elDescriptionField.setFont(font2);
  }
  
  public ArticuloListButtonField(long l)
  {
	  super(l);
  }
  
  public String getContent() 
  {
	  return this.elDescriptionField.getText();
  }
  public void setArticulo(Articulo elArticulo)
  {
	  this.elArticulo = elArticulo;
  }
  public Articulo getArticulo()
  {
	  return this.elArticulo;
  }
  public void setFlagBusqueda(boolean flag)
  {
	  this.flag_busqueda = flag;
  }
  public boolean getFlagBusqueda()
  {
	  return this.flag_busqueda;
  }

/**
   * DRAWPOSITION_TOP | DRAWPOSITION_BOTTOM | DRAWPOSITION_MIDDLE
   * Determins how the field is drawn (borders)
   * If none is set, then no borders are drawn
   */
  public void setDrawPosition( int drawPosition )
  {
      _drawPosition = drawPosition;
  }
  
  public String toString()
  {
      return _labelField.toString();
  }
  
  public void layout( int width, int height )
  {

      _targetHeight = getFont().getHeight() / 2 * 3 + 2 * VPADDING;
//#ifndef VER_4.6.1 | VER_4.6.0 | VER_4.5.0 | VER_4.2.1 | VER_4.2.0
      if( Touchscreen.isSupported() ) {
          _targetHeight = getFont().getHeight() * 2 + 2 * VPADDING;
      }
//#endif
  	
      _targetHeight *= 1.5;
      
      _leftOffset = HPADDING;
      if( _leftIcon != null )
      {
          _leftOffset += 60 /*_leftIcon.getWidth()*/ + HPADDING;
      }
      
      _rightOffset = HPADDING;
      if( _actionIcon != null ) 
      {
          _rightOffset += _actionIcon.getWidth() + HPADDING;
      }
      
      _labelField.layout( width - _leftOffset - _rightOffset - 10, height/2 );
      _labelHeight = _labelField.getHeight();
      int labelWidth = _labelField.getWidth(); //getFont().getAdvance(_labelField.getText());
      
      elDescriptionField.layout( width - _leftOffset - _rightOffset, height/2 );
      _descriptionHeight = elDescriptionField.getFont().getHeight();
      int descriptionWidth = elDescriptionField.getWidth();
      
      if( _labelField.isStyle( DrawStyle.HCENTER ) ) {
          _leftOffset = ( width - Math.max(labelWidth,descriptionWidth) ) / 2;
      } else if ( _labelField.isStyle( DrawStyle.RIGHT ) ) {
          _leftOffset = width - Math.max(labelWidth,descriptionWidth) - HPADDING - _rightOffset;
      }
      
      if( _labelField.isStyle( DrawStyle.HCENTER ) ) 
      {
          _leftOffset = ( width - labelWidth / 2);
      } 
      else if ( _labelField.isStyle( DrawStyle.RIGHT ) ) 
      {
          _leftOffset = width - labelWidth - HPADDING - _rightOffset;
      }
      
      int extraVPaddingNeeded = 0;
      if( (_labelHeight + _descriptionHeight) < _targetHeight ) 
      {
          // Make sure that they are at least 1.5 times font height
          extraVPaddingNeeded =  ( _targetHeight - _labelHeight - _descriptionHeight ) / 2;
      }
      
      setExtent( width, _labelHeight + _descriptionHeight + 20 + 2 * extraVPaddingNeeded );
  }
  
  public void setImagen(byte[] data)
  {
	  flag_busqueda = true;
	  Bitmap laFoto = Tool.getInstance().getBitmapFromBytes(data);
	  set_leftIcon(laFoto);
	  elArticulo.setFotoArticulo(laFoto);
	  ListaArticuloCache.getInstance().getListaArticulo().actualizarArticulo(elArticulo);
	  
  }
  public void set_leftIcon(Bitmap leftIcon) 
  {
		
		_leftIcon = leftIcon;
		  this.invalidate();
	  //super.set_leftIcon(leftIcon);
//		CacheFilmes.getInstance().setSmallPosterByMovieID(listID, leftIcon);
  }
  protected void onDisplay() 
  {
	  	super.onDisplay();
		if(elArticulo.getFotoArticulo() != null)
		{
			set_leftIcon(elArticulo.getFotoArticulo());
		}
		else
		{
			set_leftIcon(Tool.getInstance().getFotoBlanco());
		}
  }
  public Bitmap getFotoBlanco()
  {
	  return Tool.getInstance().sizeImage(EncodedImage.getEncodedImageResource(Constant.DIR_FOTO_BLANK), 
				60, 60).getBitmap();
  }
  public void getFotoArticulo()
  {
	  if (flag_busqueda)
	  {
		  this.flag_busqueda = false;
		  handler = new ImagenesHandler();
		  handler.GetImage(this, elArticulo.getUrlFoto());
	  }
	  
  }
  protected void onFocus(int direction) 
  {
		//super.onFocus(direction);
		//URLBitmapField post_img= new URLBitmapField();
		if(elArticulo.getFotoArticulo() != null)
		{
			if (_leftIcon == null)
			{
				set_leftIcon(elArticulo.getFotoArticulo());
				this.invalidate();
			}
		}
		else
		{	
			getFotoArticulo();
		}
		super.onFocus(direction);
  }
  
  protected void paint( Graphics g )
  {
	  int color = g.getColor();
	  
	  // Left Bitmap
      if( _leftIcon != null ) 
      {
          g.drawBitmap( HPADDING, (getHeight()/2)-(_leftIcon.getHeight()/2), _leftIcon.getWidth(), _leftIcon.getHeight(), _leftIcon, 0, 0 );
      }
      int labelWidth = _labelField.getWidth();
      // Label
      try 
      {
          g.pushRegion( _leftOffset, ( getHeight() - (_labelHeight + _descriptionHeight + 20) ) / 2, getWidth() - _leftOffset - _rightOffset, _labelHeight, 0, 0 );
          g.setFont(_labelField.getFont());
          _labelField.paint( g );
      } 
      finally 
      {
          g.popContext();
      }
      
      // descripcion
   	  g.setColor(Color.DARKSLATEGRAY);
         try {
             g.pushRegion( _leftOffset+10, (( getHeight() - (_labelHeight + _descriptionHeight + 10) ) / 2) + _labelHeight, getWidth() - _leftOffset - _rightOffset, _descriptionHeight, 0, 0 );
             g.setFont(elDescriptionField.getFont());
             elDescriptionField.paint( g );
         } finally {
             g.popContext();
         }
      // Right (Action) Bitmap
      if( _actionIcon != null ) {
          g.drawBitmap( getWidth() - HPADDING - _actionIcon.getWidth(), ( getHeight() - _actionIcon.getHeight() ) / 2, _actionIcon.getWidth(), _actionIcon.getHeight(), _actionIcon, 0, 0 );
      }
  }
  
  protected void paintBackground( Graphics g )
  {
      if( _drawPosition < 0 ) {
          // it's like a list field, let the default background be drawn
          super.paintBackground( g );
          return;
      }
      
      int oldColour = g.getColor();
      
      int background = g.isDrawingStyleSet( Graphics.DRAWSTYLE_FOCUS ) ? COLOR_BACKGROUND_FOCUS : COLOR_BACKGROUND;
      try {
          if( _drawPosition == 0 ) {
              // Top
              g.setColor( background );
              g.fillRoundRect( 0, 0, getWidth(), getHeight() + CORNER_RADIUS, CORNER_RADIUS, CORNER_RADIUS );
              g.setColor( COLOR_BORDER );
              g.drawRoundRect( 0, 0, getWidth(), getHeight() + CORNER_RADIUS, CORNER_RADIUS, CORNER_RADIUS );
              g.drawLine( 0, getHeight() - 1, getWidth(), getHeight() - 1 );
          } else if( _drawPosition == 1 ) {
              // Bottom 
              g.setColor( background );
              g.fillRoundRect( 0, -CORNER_RADIUS, getWidth(), getHeight() + CORNER_RADIUS, CORNER_RADIUS, CORNER_RADIUS );
              g.setColor( COLOR_BORDER );
              g.drawRoundRect( 0, -CORNER_RADIUS, getWidth(), getHeight() + CORNER_RADIUS, CORNER_RADIUS, CORNER_RADIUS );
          } else if( _drawPosition == 2 ) {
              // Middle
              g.setColor( background );
              g.fillRoundRect( 0, -CORNER_RADIUS, getWidth(), getHeight() + 2 * CORNER_RADIUS, CORNER_RADIUS, CORNER_RADIUS );
              g.setColor( COLOR_BORDER );
              g.drawRoundRect( 0, -CORNER_RADIUS, getWidth(), getHeight() + 2 * CORNER_RADIUS, CORNER_RADIUS, CORNER_RADIUS );
              g.drawLine( 0, getHeight() - 1, getWidth(), getHeight() - 1 );
          } else {
              // Single
              g.setColor( background );
              g.fillRoundRect( 0, 0, getWidth(), getHeight(), CORNER_RADIUS, CORNER_RADIUS );
              g.setColor( COLOR_BORDER );
              g.drawRoundRect( 0, 0, getWidth(), getHeight(), CORNER_RADIUS, CORNER_RADIUS );
          }
      } finally {
          g.setColor( oldColour );
      }
  }
  
  protected void drawFocus( Graphics g, boolean on )
  {
      if( _drawPosition < 0 ) {
          super.drawFocus( g, on );
      } else {
          boolean oldDrawStyleFocus = g.isDrawingStyleSet( Graphics.DRAWSTYLE_FOCUS );
          try {
              if( on ) {
                  g.setDrawingStyle( Graphics.DRAWSTYLE_FOCUS, true );
              }
              paintBackground( g );
              paint( g );
          } finally {
              g.setDrawingStyle( Graphics.DRAWSTYLE_FOCUS, oldDrawStyleFocus );
          }
      }
  }
  
  protected boolean keyChar( char character, int status, int time ) 
  {
      if( character == Characters.ENTER ) {
          clickButton();
          return true;
      }
      return super.keyChar( character, status, time );
  }
  
  protected boolean navigationClick( int status, int time ) 
  {
      clickButton(); 
      return true;    
  }
  
  protected boolean trackwheelClick( int status, int time )
  {        
      clickButton();    
      return true;
  }
  
  //#ifndef VER_4.1.0 | 4.0.0
  protected boolean invokeAction( int action ) 
  {
      switch( action ) {
          case ACTION_INVOKE: {
              clickButton(); 
              return true;
          }
      }
      return super.invokeAction( action );
  }
  //#endif        
       
  /**
   * A public way to click this button
   */
  public void clickButton() 
  {
      fieldChangeNotify( 0 );
  }
     
//#ifndef VER_4.6.1 | VER_4.6.0 | VER_4.5.0 | VER_4.2.1 | VER_4.2.0
  protected boolean touchEvent( TouchEvent message )
  {
      int x = message.getX( 1 );
      int y = message.getY( 1 );
      if( x < 0 || y < 0 || x > getExtent().width || y > getExtent().height ) {
          // Outside the field
          return false;
      }
      switch( message.getEvent() ) {
     
          case TouchEvent.UNCLICK:
              clickButton();
              return true;
      }
      return super.touchEvent( message );
  }
//#endif 

  public void setDirty( boolean dirty ) {}
  public void setMuddy( boolean muddy ) {}
  
  
 
}
